package {
	
	import br.com.damazzy.manterProduto.ProdutoEdicao;
	import br.com.damazzy.manterProduto.ProdutoSelecaoView;
	import br.com.damazzy.util.TratamentoErros;
	import br.com.damazzy.vo.ProdutoVO;
	
	import flash.events.Event;
	import flash.events.MouseEvent;
	
	import mx.collections.ArrayCollection;
	import mx.controls.Alert;
	import mx.events.CloseEvent;
	import mx.events.FlexEvent;
	import mx.managers.PopUpManager;
	import mx.rpc.events.FaultEvent;
	import mx.rpc.events.ResultEvent;
	
	public class ProdutoSelecao extends ProdutoSelecaoView {
		
		private var produtoEdicao: ProdutoEdicao;
		private var listaProdutos: ArrayCollection = new ArrayCollection();
		private var listaProdutosVenda: ArrayCollection;
		private var listaTiposProduto: ArrayCollection;
		private var listaTamanhos: ArrayCollection;
		private var _retornarProdutosPesquisados: Boolean = false;
		private var _telaVenda: VendaSelecao;
		
		public function ProdutoSelecao(retornarProdutosPesquisados: Boolean, telaVenda: VendaSelecao) {
			super();
			
			this.addEventListener(FlexEvent.CREATION_COMPLETE, init);
			
			include 'br/com/damazzy/util/RegistroVOs.as';
			
			_retornarProdutosPesquisados = retornarProdutosPesquisados;
			_telaVenda = telaVenda;
		}
		
		private function init(event: FlexEvent): void {
			
			if (_retornarProdutosPesquisados) {
				
				this.currentState = "pesquisaPorVenda";
				btnAdicionarListaCompras.addEventListener(MouseEvent.CLICK, adicionarListaComprasVendas);
				btnVisualizar.visible = false;
				
			} else {
				this.currentState = "";
				
				btnIncluir.addEventListener(MouseEvent.CLICK, incluir);
				btnAlterar.addEventListener(MouseEvent.CLICK, alterar);
				
				btnVisualizar.visible = true;
			}
			
			btnVisualizar.addEventListener(MouseEvent.CLICK, visualizar);
			grdProdutos.addEventListener(MouseEvent.DOUBLE_CLICK, visualizar);
			btnPesquisar.addEventListener(MouseEvent.CLICK, pesquisar);
			btnExcluir.addEventListener(MouseEvent.CLICK, alertaExcluir);
			btnFechar.addEventListener(MouseEvent.CLICK, fechar);
			this.addEventListener(CloseEvent.CLOSE, fechar);
			
			rm.obterDefinicoesSelecao.addEventListener(ResultEvent.RESULT, resultObterDefinicoesSelecao);
			rm.obterDefinicoesSelecao.addEventListener(FaultEvent.FAULT, TratamentoErros.fault);
			rm.pesquisar.addEventListener(ResultEvent.RESULT, resultPesquisar);
			rm.pesquisar.addEventListener(FaultEvent.FAULT, TratamentoErros.fault);
			rm.excluir.addEventListener(ResultEvent.RESULT, resultExcluir);
			rm.excluir.addEventListener(FaultEvent.FAULT, TratamentoErros.fault);
			
			limparDados();
			
			if (_telaVenda != null) {
				btnExcluir.includeInLayout = false;
			} else {
				btnExcluir.includeInLayout = true;
			}
			
			rm.obterDefinicoesSelecao();
		}
		
		private function resultObterDefinicoesSelecao(event: ResultEvent): void {
			listaTiposProduto = event.result.dados.listaTiposProduto;
			listaTamanhos = event.result.dados.listaTamanhos;
			
			criarItemComboTipoProduto();
			criarItemComboTamanho();
		}
		
		private function criarItemComboTipoProduto(): void {
			var objTipoProduto: ProdutoVO = new ProdutoVO();
			objTipoProduto.descTipoProduto = "---";
			
			listaTiposProduto.addItemAt(objTipoProduto, 0);
			
			cbxTipoProduto.dataProvider = listaTiposProduto;
		}
		
		private function criarItemComboTamanho(): void {
			var objTamanho: ProdutoVO = new ProdutoVO();
			objTamanho.codTamanho = "---";
			
			listaTamanhos.addItemAt(objTamanho, 0);
			
			cbxTamanho.dataProvider = listaTamanhos;
		}
		
		public function pesquisar(event: MouseEvent = null): void {
			
			var produto: ProdutoVO = new ProdutoVO();
			produto.codigo = txtCodigo.actualText == "" ? null : txtCodigo.actualText;
			produto.nome = txtNome.actualText == "" ? null : txtNome.actualText;
			produto.valor = isNaN(txtValor.valor) || txtValor.valor == 0 ? null : txtValor.valor.toString();
			produto.idTipoProduto = cbxTipoProduto.selectedIndex == 0 ? null : cbxTipoProduto.selectedItem.idTipoProduto;
			produto.idTamanho = cbxTamanho.selectedIndex == 0 ? null : cbxTamanho.selectedItem.idTamanho;
			
			rm.pesquisar(produto);
		}
		
		private function resultPesquisar(event: ResultEvent): void {
			listaProdutosVenda = new ArrayCollection();
			listaProdutos = event.result.dados.lista;
			
			if (_retornarProdutosPesquisados) {
				grdProdutosVenda.dataProvider = listaProdutos;	
			} else {
				grdProdutos.dataProvider = listaProdutos;
			}
			
			if (listaProdutos.length == 0) {
				Alert.show("Nenhum produto encontrado com o filtro informado.", "Aviso!");
			}
		}
		
		private function visualizar(event: MouseEvent): void {
			
			if (grdProdutos.selectedItem != null) {
				produtoEdicao = new ProdutoEdicao(grdProdutos.selectedItem as ProdutoVO);
				produtoEdicao.telaPai = this;
				produtoEdicao.visualizarDados = true;
				PopUpManager.addPopUp(produtoEdicao, this, true);
				PopUpManager.centerPopUp(produtoEdicao);
				
			} else {
				Alert.show("Selecione um produto na lista para visualizar.", "Aviso!");
			}
		}
		
		private function incluir(event: MouseEvent): void {
			produtoEdicao = new ProdutoEdicao(null);
			produtoEdicao.telaPai = this;
			PopUpManager.addPopUp(produtoEdicao, this, true);
			PopUpManager.centerPopUp(produtoEdicao);
		}
		
		private function alterar(event: MouseEvent): void {
			
			if (grdProdutos.selectedItem != null) {
				produtoEdicao = new ProdutoEdicao(grdProdutos.selectedItem as ProdutoVO);
				produtoEdicao.telaPai = this;
				PopUpManager.addPopUp(produtoEdicao, this, true);
				PopUpManager.centerPopUp(produtoEdicao);
				
			} else {
				Alert.show("Selecione um produto na lista para alterar.", "Aviso!");
			}
		}
		
		private function alertaExcluir(event: MouseEvent): void {
			if (grdProdutos.selectedItem != null) {
				Alert.yesLabel = "Sim";
                Alert.noLabel = "Não";
				Alert.show("Deseja realmente excluir o produto selecionado?", "Exclusão", 1|2, this, excluir);
			} else {
				Alert.show("Selecione um produto na lista e clique em excluir.", "Aviso!");
			}
		}
		
		private function excluir(event: CloseEvent): void {
			
			if (!_retornarProdutosPesquisados) {
			
				if (event.detail == Alert.YES) {
					var produtoExcluido: ProdutoVO = grdProdutos.selectedItem as ProdutoVO;
					rm.excluir(produtoExcluido);
				}
				
			} else {
				listaProdutos.removeItemAt(grdProdutos.selectedIndex);
				listaProdutosVenda.removeItemAt(grdProdutos.selectedIndex);
			}
		}
		
		private function resultExcluir(result: ResultEvent): void {
			Alert.show("Produto excluído com sucesso.", "Aviso!");
			pesquisar();
		}
		
		public function adicionarProdutoListaCompras(produtoVO: ProdutoVO): void {
			listaProdutosVenda.addItem(produtoVO);
		}
		
		public function removerProdutoListaCompras(vo: ProdutoVO): void {
			listaProdutosVenda.removeItemAt(listaProdutosVenda.getItemIndex(vo));
		}
		
		private function adicionarListaComprasVendas(event: MouseEvent): void {
			
			if (_telaVenda != null) {
				
				if (listaProdutosVenda != null && listaProdutosVenda.length > 0) {
					_telaVenda.resultPesquisarProduto(listaProdutosVenda);
					this.fechar();
				} else {
					Alert.show("Não existem produtos selecionados para serem adicionados na lista de compras.", "Erro!");	
				}
			}
		}
		
		private function fechar(event: Event = null): void {
			PopUpManager.removePopUp(this);
		}
		
		private function limparDados(): void {
			txtCodigo.actualText = "";
			txtNome.actualText = "";
			txtValor.text = "";
			cbxTipoProduto.selectedIndex = 0;
			cbxTamanho.selectedIndex = 0;
			
			grdProdutos.dataProvider = null;
			
			if (_retornarProdutosPesquisados) {
				listaProdutosVenda = new ArrayCollection();
				grdProdutosVenda.dataProvider = null;
			}
		}
		
		public function get telaVenda(): VendaSelecao {
			return _telaVenda;
		}
	}
}